#ifndef DPISERVICE_H
#define DPISERVICE_H

#include <QString>
#include <QObject>
#include "systemconfig.h"
#include "outputsettings.h"

/**
 * DPI服务 - 统一管理所有DPI相关逻辑
 *
 * Martin Fowler重构原则：
 * 1. 单一职责：专门处理DPI计算和策略
 * 2. 服务层模式：为上层组件提供简单的接口
 * 3. 策略模式：封装不同的DPI使用场景
 */
class ProcessingSettings; // 前向声明

class DpiService : public QObject
{
    Q_OBJECT

public:
    // DPI使用场景 - 清晰表达意图
    enum class DpiPurpose {
        CacheGeneration,  // 缓存生成 - 使用系统配置
        WindowRendering,  // 窗口渲染 - 使用配置面板
        PdfExport       // PDF导出 - 使用配置面板
    };

    // DPI分析结果 - 数据传输对象
    struct DpiAnalysis {
        double systemDpi;         // 系统配置DPI
        double panelDpi;          // 配置面板DPI
        double effectiveDpi;      // 有效DPI（实际使用）
        bool isCacheSufficient;   // 缓存是否足够高质量
        QString suggestion;       // 给用户的建议

        bool needsWarning() const {
            return !isCacheSufficient && panelDpi > systemDpi;
        }

        QString getWarningMessage() const {
            if (needsWarning()) {
                return QString("缓存质量(%1 DPI)低于导出要求(%2 DPI)，建议到系统配置提高DPI重建缓存")
                       .arg(systemDpi)
                       .arg(panelDpi);
            }
            return QString();
        }
    };

    // 单例模式 - 全局唯一实例
    static DpiService& instance();

    // Martin Fowler重构：依赖注入 - 设置ProcessingSettings
    void setProcessingSettings(const ProcessingSettings* settings);

    // 获取指定用途的DPI - 策略模式
    double getDpiForPurpose(DpiPurpose purpose) const;

    // 分析当前DPI配置 - 提供诊断信息
    DpiAnalysis analyzeDpiConfiguration() const;

    // 检查是否需要显示警告
    bool shouldShowWarning() const;

    // 生成警告消息
    QString generateWarningMessage() const;

    // 计算A4尺寸的像素数 - 工具方法
    QSize calculateA4PixelSize(DpiPurpose purpose) const;

    // 验证DPI配置一致性
    bool validateDpiConsistency() const;

signals:
    // DPI配置变更信号 - 观察者模式
    void dpiConfigurationChanged(const DpiAnalysis& analysis);

    // 需要警告用户信号
    void dpiWarningRequired(const QString& message);

private:
    explicit DpiService(QObject* parent = nullptr);
    ~DpiService() = default;

    // 禁用拷贝构造和赋值 - 单例模式
    DpiService(const DpiService&) = delete;
    DpiService& operator=(const DpiService&) = delete;

    // 静态实例指针
    static DpiService* s_instance;

    // Martin Fowler重构：依赖注入 - ProcessingSettings引用
    const ProcessingSettings* m_processingSettings;

    // 内部方法 - 获取配置源
    double getSystemConfigDpi() const;
    double getPanelConfigDpi() const;
    double calculateEffectiveDpi(double systemDpi, double panelDpi) const;

    // 调试方法
    void logDpiInformation(const QString& context, DpiPurpose purpose) const;
};

// 便利宏 - 简化调用
#define DpiSvc DpiService::instance()

#endif // DPISERVICE_H